<?php
/**
 * 所有货品列表页面
 */
class ListController extends CommonController {

	private $model;

	public function __init() {
		parent::__init();
		$this -> model = K('List');
	}

	/**
	 * 列表展示页面
	 */
	public function index() {
		//获得当前分类ID
		$cid = Q('get.cid', 0, 'intval');
		//当传入的CID为0的时候也就是没有传入CID那么将遍历所有的商品
		//获得当前分类所有的筛选条件
		$goodsIds = $this -> getFilter($cid);
		//获得当前面包屑导航
		$this -> assign('mbx', K('Category') -> getFather($cid));
		$this -> display();
	}

	//获得所有的子分类
	private function _getSon($cid) {
		$sons = K('Category') -> getAllChild($cid);
		$sons[] = $cid;
		return implode(',', $sons);

	}

	/**
	 * 获得所有的子分类下面的商品 GID  对商品进行筛选
	 * 1、先获得所有商品ID
	 * 2、再获得相应分类下面的所有商品的属性去重
	 * 3、再获得相应商品属性的属性 属性头
	 *
	 */
	private function getFilter($cid) {
		$cids = $this -> _getSon($cid);
		//所有分类的CIDS
		//获得所有的商品GID
		$gids = K('Goods') -> where("goods_cateid in ({$cids})") -> getField('gid', true);
		if ($gids) {
			//			var_dump($gids);
			//获得当前商品的所有类开属性和规格属性 还要相应的规格
			$attrids = K('GoodsAttr') -> where('goods_gid in (' . implode(',', $gids) . ')') -> group('attr_value') -> order('attid DESC') -> all();
			//			var_dump($attrids);
			//将相同的类型属性ID的属性放在一个子数组中
			foreach ($attrids as $v) {
				$tempFinal[$v['typeattr_id']][] = $v;
			}
			//获得属性头名 组合为一个新的数组
			$tempFinalArr = array();
			foreach ($tempFinal as $typetid => $value) {
				$tempFinalArr[] = array('name' => K('TypeAttr') -> where('id=' . $typetid) -> getField('attrname'), 'value' => $value);
			}
			//			p($tempFinalArr);
			//将当前分类中的属性分配到模板
			$this -> assign('attrlist', $tempFinalArr);
			//参数问题
			//实现param/0_0_0_0_0_0 有几列行属性就有几个0
			//统计有几行属性
			$count = count($tempFinalArr);

			//使用一个数据来填充$count个0  如果没有传入任何参数那么表示为 查询当前分类下所有的商品
			$param = isset($_GET['param']) ? explode('_', $_GET['param']) : array_fill(0, $count, 0);
			//			var_dump($param);
			$this -> assign('param', $param);

			//查询有相应属性或规格的商品ID
			foreach ($param as $v) {
				//如果$v的情况下才进行自关联查询否则 就不查询
				if ($v) {
					$paramGids[] = M() -> join('__goods_attr__ g1 JOIN __goods_attr__ g2 ON g1.attr_value=g2.attr_value') -> where("g1.attid={$v}") -> getField('g2.goods_gid', true);
				}
			}
			//每行会得到一个数组 也就是有相应属性的gid商品
			//取交集
			//和第一个取将领
			//如果有进行筛选
			if (isset($paramGids)) {
				$findGoods = $paramGids[0];
				foreach ($paramGids as $tmp) {
					if ($tmp) {
						$findGoods = array_intersect($findGoods, $tmp);
					}
				}
				//再和当前分类下面的商品取一个交集就可以得到最终这个筛选组合的商品GID
				$okGoods = array_intersect($findGoods, $gids);
				//总数量 如果找不到那么表示为0
				$goods['count'] = count($okGoods) == 0 ? 0 : count($okGoods);
				$this -> assign('count', $goods['count']);
				if ($okGoods) {
					//如果进行了筛选那么将他进行分页再分配
					$page = new Page(count($okGoods), 100, 10);
					if (Q('get.isnew', 0, 'intval')) {
						$goods['data'] = K('Goods') -> where('gid in (' . implode(',', $okGoods) . ')') -> order('goods_uptime DESC') -> limit($page -> limit()) -> all();
					} elseif (Q('get.pricehight', 0, 'intval')) {
						//按高价排序
						$goods['data'] = K('Goods') -> where('gid in (' . implode(',', $okGoods) . ')') -> order('shop_price DESC') -> limit($page -> limit()) -> all();
					} elseif (Q('get.pricelowe', 0, 'intval')) {
						//按低价排序
						$goods['data'] = K('Goods') -> where('gid in (' . implode(',', $okGoods) . ')') -> order('shop_price ASC') -> limit($page -> limit()) -> all();
					} else {
						$goods['data'] = K('Goods') -> where('gid in (' . implode(',', $okGoods) . ')') -> limit($page -> limit()) -> all();
					}

					$goods['page'] = $page -> show(2);
					$goods['page2'] = $page -> show(3);
					$this -> assign('goods', $goods['data']);
					$this -> assign('page', $goods['page']);
					$this -> assign('page2', $goods['page2']);
				}

			} else {
				//如果没有进筛选那么直接返回该分类下面的所有商品
				$findGoods = $gids;
				$goods = $this -> model -> getCateGoods($cid);
				$page = new Page(count($goods['data']), 20, 10);
				if (Q('get.isnew', 0, 'intval')) {
					usort($goods['data'],'isnew');
				} elseif (Q('get.pricehight', 0, 'intval')) {
					//按高价排序
					usort($goods['data'],'pricehight');
				} elseif (Q('get.pricelowe', 0, 'intval')) {
					//按低价排序
					usort($goods['data'],'pricelow');
					p($goods['data']);
				}

				$goods['page'] = $page -> show(2);
				$goods['page2'] = $page -> show(3);
				$this -> assign('count', $goods['count']);
				$this -> assign('goods', $goods['data']);
				$this -> assign('page', $goods['page']);
				$this -> assign('page2', $goods['page2']);
			}
		}
	}
	

}
